﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionePolveriLib.Facades;
using GestionePolveriLib.BL;
using GestionePolveriLib.Utilities;

namespace GestionePolveri2.Editors
{
    public partial class ScaricoDettaglio : DettaglioControlBase
    {
        private int m_causale;
        private List<Colore> m_coloriAssociati = null;
        private bool m_giacenzaInsufficienteflag = false;
        private bool m_sottoScortaFlag = false;

        private Double quant_old = 0;
        private long idlotto_old = 0;
        private int idPolvere_old = 0;

        private bool m_polveriLoaded = false;
        private bool m_scatoleLoaded = false;
        private bool m_impiantiLoaded = false;
        private DateTime m_dataRegistrazione = DateTime.Now;

        public DateTime DataRegistrazione
        {
            get { return m_dataRegistrazione; }
            set { m_dataRegistrazione = value; }
        }

        public ScaricoDettaglio()
        {
            InitializeComponent();
        }

        #region Public Methods...
        public override bool Add()
        {
            bool retValue = false;

            if (Validate("A"))
            //if (ApplyRules())
            {
                using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
                {
                    double quant = 0;
                    // inserisco il record relativo al movimento di scarico
                    Movimento imp = new Movimento();
                    imp.GiacenzaInsufficienteFlag = m_giacenzaInsufficienteflag;
                    imp.SottoScortaFlag = m_sottoScortaFlag;

                    imp.IDCausale = m_causale;
                    imp.DataMovimento = dyndataMovimentoDateTimePicker.Value;
                    imp.DataRegistrazione = m_dataRegistrazione;

                    imp.IDPolvere = ((Polvere)dynCmbPolveri.SelectedValue).ID;
                    imp.IDFormato = ((Scatola)dyncmbScatole.SelectedValue).ID;
                    imp.Formato = ((Scatola)dyncmbScatole.SelectedValue).Formato;

                    double num;
                    if (double.TryParse(dynnumScatoleTextBox.Text, out num))
                        imp.NumScatole = num;

                    long idlotto = ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;

                    LottoFacade l = new LottoFacade();
                    Lotto lotto = new Lotto();
                    lotto = l.GetLotto(idlotto);

                    if (double.TryParse(dynQuantita.Text, out quant))
                    {
                        imp.Quantita = quant;
                        //imp.Giacenza = lotto.Giacenza - quant;
                        //imp.Valore = imp.Giacenza * lotto.PrezzoUnitario;
                    }

                    imp.Note = this.dynNoteTextBox.Text;
                    imp.IDImpianto = ((Impianto)(this.dyncmbImpianti.SelectedValue)).ID;
                    imp.IDOperatore = this.Principal.Operatore.ID;
                    imp.IDLotto = ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;

                    imp.Note = this.dynNoteTextBox.Text;

                    if (dynCmbCausaliScarico.SelectedIndex != 0 && dynCmbCausaliScarico.SelectedIndex != -1)
                    {
                        CausaliScaricoFacade pf = new CausaliScaricoFacade();
                        string cod = ((CausaleScarico)(this.dynCmbCausaliScarico.SelectedValue)).CodCausale;
                        imp.IDCausaleScarico = ((CausaleScarico)pf.GetCausaleScarico(cod)).ID;
                    }

                    MovimentiFacade impf = new MovimentiFacade();
                    impf.AddMovimento(imp);

                    // gestione dello stato di movimentazione del lotto...
                    l.UpdateStatoMovimentazione(imp.IDLotto, true);

                    // aggiunge i colori associati alla polvere movimentata nello storico colori movimenti...
                    impf.AddToStoricoColoriMovimenti(imp.IDMovimento, m_coloriAssociati, "I");

                    // aggiunge la traccia nello storico movimenti...
                    //impf.AddToStoricoMovimenti(imp);

                    //Aggiorno la giacenza lotto
                    LottoFacade lot = new LottoFacade();
                    lot.AggLotto(idlotto, quant);

                    //impf.AddToStoricoMovimenti(imp);

                    transaction.Complete();

                    MessageBox.Show("Inserimento Effettuato con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    retValue = true;
                }

                OnLoadData(EventArgs.Empty);
            }

            return retValue;
        }

        public override bool Modify()
        {
            bool retValue = false;

            if (Validate("M"))
            //if (ApplyRules())
            {
                using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
                {
                    Movimento imp = new Movimento();
                    imp.IDMovimento = this.Movimento.IDMovimento;
                    imp.IDCausale = m_causale;
                    imp.DataMovimento = dyndataMovimentoDateTimePicker.Value;
                    imp.DataRegistrazione = m_dataRegistrazione;

                    imp.IDPolvere = ((Polvere)dynCmbPolveri.SelectedValue).ID;
                    imp.IDFormato = ((Scatola)dyncmbScatole.SelectedValue).ID;

                    Lotto m_lotto = (Lotto)this.dynListvLotti.CheckedItems[0].Tag;
                    imp.NumDdt = m_lotto.NumDdt;
                    imp.DataDdt = m_lotto.DataDdt;

                    double num;
                    if (double.TryParse(dynnumScatoleTextBox.Text, out num))
                        imp.NumScatole = num;

                    imp.GiacenzaInsufficienteFlag = m_giacenzaInsufficienteflag;
                    imp.SottoScortaFlag = m_sottoScortaFlag;

                    double quant;
                    if (double.TryParse(dynQuantita.Text, out quant))
                    {
                        imp.Quantita = quant;
                        imp.Giacenza = imp.Giacenza + quant_old - quant;
                    }

                    long m_idlotto = ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;

                    imp.Note = this.dynNoteTextBox.Text;
                    imp.IDImpianto = ((Impianto)(this.dyncmbImpianti.SelectedValue)).ID;
                    imp.IDOperatore = this.Principal.Operatore.ID;
                    //imp.IDLotto = base.Current.IDLotto;
                    imp.IDLotto = m_idlotto;
                    this.Movimento.IDLotto = m_idlotto;
                    imp.Note = this.dynNoteTextBox.Text;

                    if (dynCmbCausaliScarico.SelectedIndex != 0 && dynCmbCausaliScarico.SelectedIndex != -1)
                    {
                        CausaliScaricoFacade pf = new CausaliScaricoFacade();
                        string cod = ((CausaleScarico)(this.dynCmbCausaliScarico.SelectedValue)).CodCausale;
                        imp.IDCausaleScarico = ((CausaleScarico)pf.GetCausaleScarico(cod)).ID;
                    }

                    MovimentiFacade impf = new MovimentiFacade();
                    impf.ModifyMovimento(imp);

                    // aggiunge i colori associati in quel momento alla polvere movimentata nello storico colori movimenti...
                    impf.AddToStoricoColoriMovimenti(imp.IDMovimento, m_coloriAssociati, "M");

                    //Ripristino giacenza lotto vecchio                                                             
                    LottoFacade lot = new LottoFacade();
                    lot.RipristinoLotto(idlotto_old, quant_old);

                    //Aggiorno la giacenza lotto nuovo
                    long idlotto = ((Lotto)this.dynListvLotti.CheckedItems[0].Tag).IDLotto;
                    lot.AggLotto(idlotto, quant);
                    //

                    //MovimentiFacade mf = new MovimentiFacade();
                    //mf.AggMovimento(imp.IDMovimento);

                    transaction.Complete();

                    MessageBox.Show("Modifica Effettuata con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    retValue = true;
                }

                OnLoadData(EventArgs.Empty);
            }

            return retValue;
        }

        public override bool Delete()
        {
            bool retValue = false;

            Movimento imp = new Movimento();
            imp.IDMovimento = this.Movimento.IDMovimento;
            //30/06/2012
            MovimentiFacade impf = new MovimentiFacade();
            imp = impf.GetMovimento(this.Movimento.IDMovimento);

            using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
            {
                LottoFacade lot = new LottoFacade();

                if (lot.RipristinoLotto(idlotto_old, quant_old))
                {
                    if (impf.DeleteFisicaMovimento(imp))
                    {
                        impf.AddToStoricoColoriMovimenti(imp.IDMovimento, m_coloriAssociati, "D");

                        lot.CheckStatoMovimentazione(imp.IDLotto);

                        transaction.Complete();

                        MessageBox.Show("Cancellazione Effettuata con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        retValue = true;
                    }
                }
            }

            OnLoadData(EventArgs.Empty);

            return retValue;
        }

        public override void ClearControls()
        {
            m_giacenzaInsufficienteflag = false;
            m_sottoScortaFlag = false;

            this.dyndataMovimentoDateTimePicker.Value = DateTime.Now;
            this.dynnumScatoleTextBox.Text = string.Empty;

            this.dynListvLotti.Items.Clear();

            this.lblNumDDT.Text = "Num. DDT:";
            this.lblDataDDT.Text = "Data DDT:";
            this.lblDescrizionePolvere.Text = "Polvere:";
            this.lblFornitoreDescrizione.Text = "Fornitore:";
        }

        public override bool Validate(string op)
        {
            bool retValue = true;
            decimal num = 0;
            decimal quant = 0;

            //if (((Impianto)dyncmbImpianti.SelectedValue).Nome == string.Empty)
            if (dyncmbImpianti.SelectedIndex == 0)
            {
                retValue = false;
                //MessageBox("Attenzione!... e' necessario selezionare un impianto");
                MessageBox.Show("Attenzione!... e' necessario selezionare un impianto");
                return retValue;
            }

            if (dynCmbPolveri.SelectedIndex == 0)
            {
                retValue = false;
                MessageBox.Show("Selezionare un codice polvere");
                return retValue;
            }

            if (this.dynListvLotti.CheckedItems.Count == 0)
            {
                retValue = false;
                MessageBox.Show("Attenzione!... e' necessario selezionare un lotto");
                //this.ShowNotBlockingMessage("Attenzione!... e' necessario selezionare un lotto", MessageBoxIcon.Error);

                return retValue;
            }

            if (!(decimal.TryParse(dynnumScatoleTextBox.Text, out num)))
            {
                retValue = false;
                MessageBox.Show("Valore non numerico per numero scatole");

                //this.ShowNotBlockingMessage("Indicare un valore numerico per numero scatole", MessageBoxIcon.Error);
                return retValue;
            }
            else
            {
                if (num == 0)
                {
                    retValue = false;
                    MessageBox.Show("Inserire un numero scatole valido");
                    //this.ShowNotBlockingMessage("Inserire un numero scatole valido", MessageBoxIcon.Error);
                    return retValue;
                }
            }

            if (dyncmbScatole.SelectedIndex == 0)
            {
                retValue = false;
                MessageBox.Show("Selezionare un formato per le scatole");
                return retValue;
            }

            if (num <= 0)
            {
                retValue = false;
                MessageBox.Show("Numero scatole non valido. Inserire un valore maggiore di zero");
                return retValue;
            }
            else
            {
                retValue = DoChecks(op);
            }

            return retValue;
        }

        private void SetupData()
        {
            if (m_polveriLoaded && m_scatoleLoaded && m_impiantiLoaded)
            {
                if (this.Movimento != null)
                {
                    SetMovimento();
                }
            }
        }

        public override void InitializeControl()
        {
            this.dynListvLotti.MultiSelect = false;

            this.Principal = (OperatorePrincipal)this.Principal;

            CausaliMagazzinoFacade cmf = new CausaliMagazzinoFacade();
            m_causale = cmf.GetCausaleByCod("S").ID;

            //this.dynListvLotti.Columns("Lotto").width=

            this.dynnumScatoleTextBox.TextChanged -= new EventHandler(dynnumScatoleTextBox_TextChanged);
            this.dyncmbScatole.SelectedIndexChanged -= new EventHandler(dyncmbScatole_SelectedIndexChanged);
            this.dynCmbPolveri.SelectedIndexChanged -= new EventHandler(dynCmbPolveri_SelectedIndexChanged);

            LoadPolveri();
            LoadScatole();
            LoadImpianti();
            LoadCausaliScarico();

            if (this.Movimento != null)
            {
                SetMovimento();
            }

            this.dynnumScatoleTextBox.TextChanged += new EventHandler(dynnumScatoleTextBox_TextChanged);
            this.dyncmbScatole.SelectedIndexChanged += new EventHandler(dyncmbScatole_SelectedIndexChanged);
            this.dynCmbPolveri.SelectedIndexChanged += new EventHandler(dynCmbPolveri_SelectedIndexChanged);

            OnLoadData(EventArgs.Empty);

        }

        public override void SetMovimento()
        {
            this.lblNumDDT.Text = string.Format("Num. DDT: {0}", this.Movimento.NumDdt);
            this.lblDataDDT.Text = string.Format("Data DDT: {0}", this.Movimento.DataDdt.ToShortDateString());

            this.dyndataMovimentoDateTimePicker.Value = this.Movimento.DataMovimento;
            this.dynnumScatoleTextBox.Text = this.Movimento.NumScatole.ToString();
            this.dynQuantita.Text = this.Movimento.Quantita.ToString();
            quant_old = this.Movimento.Quantita;
            idlotto_old = this.Movimento.IDLotto;
            idPolvere_old = this.Movimento.IDPolvere;

            this.dynCmbPolveri.SelectedIndexChanged += new EventHandler(dynCmbPolveri_SelectedIndexChanged);
            this.SelectComboItem(this.dynCmbPolveri, this.Movimento.CodicePolvere);
            this.dynCmbPolveri.SelectedIndexChanged -= new EventHandler(dynCmbPolveri_SelectedIndexChanged);

            //this.SelectComboItem(this.dyncmbLotti, this.Movimento.CodiceLotto);
            this.SelectComboItem(this.dyncmbScatole, this.Movimento.Formato);

            //ScatoleFacade sf = new ScatoleFacade();
            //Scatola scatola = new Scatola();

            //scatola = sf.GetScatolaByLotto(this.Movimento.IDLotto, "C");
            //this.SelectComboItem(this.dyncmbScatole, scatola.Formato);

            this.SelectComboItem(this.dyncmbImpianti, this.Movimento.Impianto);

            this.dynNoteTextBox.Text = this.Movimento.Note;

            LoadLotti(this.Movimento.IDPolvere, this.Movimento.IDLotto);
        }
        #endregion

        #region Load Methods...
        private void LoadPolveri()
        {
            FilterComboBoxHelper.SetupPolveriComboBoxCS(this.dynCmbPolveri);

            //PolvereFacade pf = new PolvereFacade();
            //pf.LoadAsync((result) =>
            //{
            //    List<Polvere> m_data = new List<Polvere>();
            //    m_data.Add(new Polvere() { CodicePolvere = "Seleziona una polvere", ID = -1 });
            //    m_data.AddRange(pf.GetAll());

            //    this.dynCmbPolveri.DisplayMember = "CodicePolvere";
            //    this.dynCmbPolveri.ValueMember = "ID";
            //    this.dynCmbPolveri.DataSource = m_data;

            //    m_polveriLoaded = true;
            //    SetupData();
            //});
        }

        private void LoadColori()
        {
            ComposizioneColoreFacadeExt pf = new ComposizioneColoreFacadeExt();
            pf.LoadAsync((result) =>
            {
                m_coloriAssociati = pf.GetColoriAssociati(((Polvere)this.dynCmbPolveri.SelectedValue).ID);

                if (m_coloriAssociati != null)
                {
                    this.dynLVColoriAbbinati.Items.Clear();
                    foreach (Colore c in m_coloriAssociati)
                    {
                        ListViewItem item = new ListViewItem(c.CodiceColore);

                        ListViewItem.ListViewSubItem subitem = new ListViewItem.ListViewSubItem(item, c.Applicazione);
                        item.SubItems.Add(subitem);

                        ListViewItem.ListViewSubItem subitem1 = new ListViewItem.ListViewSubItem(item, c.FamigliaDescrizione);
                        item.SubItems.Add(subitem1);

                        this.dynLVColoriAbbinati.Items.Add(item);
                    };
                }
            });
        }

        private void LoadScatole()
        {
            ScatoleFacade pf = new ScatoleFacade();

            pf.LoadScatoleAsync((result) =>
            {
                List<Scatola> m_data = new List<Scatola>();
                m_data.Add(new Scatola() { Formato = "Seleziona un formato", ID = -1 });
                m_data.AddRange((List<Scatola>)result);

                this.dyncmbScatole.DisplayMember = "Formato";
                this.dyncmbScatole.ValueMember = "ID";

                this.dyncmbScatole.DataSource = m_data;

                m_scatoleLoaded = true;
                //SetupData();
                if (this.Movimento != null)
                {
                    this.SelectComboItem(this.dyncmbScatole, this.Movimento.Formato);
                }
            });
        }

        private void LoadImpianti()
        {
            ImpiantoFacade pf = new ImpiantoFacade();
            pf.LoadImpiantoAsync((result) =>
            {
                List<Impianto> m_data = new List<Impianto>();
                m_data.Add(new Impianto() { Nome = "Seleziona un impianto", ID = -1 });
                m_data.AddRange((List<Impianto>)result);

                this.dyncmbImpianti.DisplayMember = "Nome";
                this.dyncmbImpianti.ValueMember = "ID";
                this.dyncmbImpianti.DataSource = m_data;

                m_impiantiLoaded = true;
                //SetupData();
                if (this.Movimento != null)
                {
                    this.SelectComboItem(this.dyncmbImpianti, this.Movimento.Impianto);
                }

            });
        }

        private void LoadCausaliScarico()
        {
            CausaliScaricoFacade pf = new CausaliScaricoFacade();
            pf.LoadAsync((result) =>
            {
                List<CausaleScarico> m_data = new List<CausaleScarico>();
                m_data.Add(new CausaleScarico() { Descrizione = "Seleziona una causale", ID = -1 });
                m_data.AddRange(pf.GetAll());

                this.dynCmbCausaliScarico.DisplayMember = "Descrizione";
                this.dynCmbCausaliScarico.ValueMember = "ID";
                this.dynCmbCausaliScarico.DataSource = m_data;

                this.dynCmbCausaliScarico.Enabled = true;
                if (this.Movimento != null)
                {
                    this.SelectComboItem(this.dynCmbCausaliScarico, this.Movimento.CausaleScarico);
                    if (this.Movimento.CausaleScarico == "I")
                        this.dynCmbCausaliScarico.Enabled = false;
                }
            });
        }

        private void LoadLotti(long idPolvere)
        {
            LottoFacade pf = new LottoFacade();
            pf.LoadAsync((result) =>
            {
                this.dynListvLotti.Items.Clear();

                if (result != null)
                {
                    this.dynListvLotti.ItemChecked -= new ItemCheckedEventHandler(dynListvLotti_ItemChecked);

                    foreach (Lotto lt in (List<Lotto>)result)
                    {
                        ListViewItem item = new ListViewItem(lt.CodLotto);

                        item.Name = lt.CodLotto;
                        
                        item.Tag = lt;
                        ListViewItem.ListViewSubItem sItem1 = new ListViewItem.ListViewSubItem(item, lt.DataDdt.ToShortDateString());
                        ListViewItem.ListViewSubItem sItem2 = new ListViewItem.ListViewSubItem(item, lt.DataScadenzaLotto.ToShortDateString());
                        ListViewItem.ListViewSubItem sItem3 = new ListViewItem.ListViewSubItem(item, lt.Giacenza.ToString());
                        ListViewItem.ListViewSubItem sItem4 = new ListViewItem.ListViewSubItem(item, lt.CodicePolvere);
                        ListViewItem.ListViewSubItem sItem5 = new ListViewItem.ListViewSubItem(item, lt.Fornitore);
                        ListViewItem.ListViewSubItem sItem6 = new ListViewItem.ListViewSubItem(item, lt.NoteCarico);

                        item.SubItems.Add(sItem1);
                        item.SubItems.Add(sItem2);
                        item.SubItems.Add(sItem3);
                        item.SubItems.Add(sItem4);
                        item.SubItems.Add(sItem5);
                        item.SubItems.Add(sItem6);

                        this.dynListvLotti.Items.Add(item);

                        if (lt.IDLotto == this.Movimento.IDLotto)
                        {
                            item.Checked = true;
                        }
                        else
                        {
                            item.Checked = false;
                        }
                    }

                    this.dynListvLotti.ItemChecked += new ItemCheckedEventHandler(dynListvLotti_ItemChecked);
                }
            }, idPolvere);
        }

        private void LoadLotti(long idPolvere, long idlotto)
        {
            LottoFacade pf = new LottoFacade();
            pf.LoadAsyncAll((result) =>
            {
                this.dynListvLotti.Items.Clear();

                if (result != null)
                {
                    this.dynListvLotti.ItemChecked -= new ItemCheckedEventHandler(dynListvLotti_ItemChecked);

                    foreach (Lotto lt in (List<Lotto>)result)
                    {
                        ListViewItem item = new ListViewItem(lt.CodLotto);

                        item.Name = lt.CodLotto;
                        item.Tag = lt;
                        ListViewItem.ListViewSubItem sItem1 = new ListViewItem.ListViewSubItem(item, lt.DataDdt.ToShortDateString());
                        ListViewItem.ListViewSubItem sItem2 = new ListViewItem.ListViewSubItem(item, lt.DataScadenzaLotto.ToShortDateString());
                        ListViewItem.ListViewSubItem sItem3 = new ListViewItem.ListViewSubItem(item, lt.Giacenza.ToString());
                        ListViewItem.ListViewSubItem sItem4 = new ListViewItem.ListViewSubItem(item, lt.CodicePolvere);
                        ListViewItem.ListViewSubItem sItem5 = new ListViewItem.ListViewSubItem(item, lt.Fornitore);

                        item.SubItems.Add(sItem1);
                        item.SubItems.Add(sItem2);
                        item.SubItems.Add(sItem3);
                        item.SubItems.Add(sItem4);
                        item.SubItems.Add(sItem5);

                        this.dynListvLotti.Items.Add(item);

                        if (lt.IDLotto == idlotto)
                        {
                            item.Checked = true;
                        }
                        else
                        {
                            item.Checked = false;
                        }
                    }
                    this.dynListvLotti.ItemChecked += new ItemCheckedEventHandler(dynListvLotti_ItemChecked);
                }
            }, idPolvere);
        }
        #endregion

        #region Event Handlers...
        void dynnumScatoleTextBox_TextChanged(object sender, EventArgs e)
        {
            CalcolaQuantita();
        }

        void dyncmbScatole_SelectedIndexChanged(object sender, EventArgs e)
        {
            CalcolaQuantita();
        }

        void dynListvLotti_ItemChecked(object sender, ItemCheckedEventArgs e)
        {
            // controllo che l'item sia selezionato e nel caso che ne sia selezionato uno solo...
            if (!e.Item.Checked) return;

            if ((e.Item.Checked) && (this.dynListvLotti.CheckedItems.Count > 1))
            {
                e.Item.Checked = false;
                return;
            }

            Lotto m_lotto = (Lotto)e.Item.Tag;

            this.lblNumDDT.Text = string.Format("Num. DDT: {0}", m_lotto.NumDdt);
            this.lblDataDDT.Text = string.Format("Data DDT: {0}", m_lotto.DataDdt.ToShortDateString());

            ScatoleFacade sf = new ScatoleFacade();
            Scatola scatola = new Scatola();

            scatola = sf.GetScatolaByLotto(m_lotto.IDLotto, "C");
            this.SelectComboItem(this.dyncmbScatole, scatola.Formato);
        }

        void dynTxtSearch_KeyUp(object sender, KeyEventArgs e)
        {

        }

        void dynCmbPolveri_SelectedIndexChanged(object sender, EventArgs e)
        {
            LoadColori();

            Polvere m_polvere = (Polvere)this.dynCmbPolveri.SelectedValue;
            if (m_polvere.ID != -1)
            {
                LoadLotti(m_polvere.ID, this.Movimento.IDLotto);

                this.lblDescrizionePolvere.Text = string.Format("Polvere: {0}", m_polvere.Descrizione);
                this.lblFornitoreDescrizione.Text = string.Format("Fornitore: {0}", m_polvere.Fornitore.Descrizione);
                this.dynNotePolvere.Text = string.Format("Note: {0}", m_polvere.Note);
            }
        }
        #endregion

        #region Private Methods
        private void CalcolaQuantita()
        {
            decimal quant = 0;
            decimal num = 0;

            if (!(this.dyncmbScatole.SelectedIndex == -1) && (decimal.TryParse(dynnumScatoleTextBox.Text, out num)))
            {
                quant = num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura;
                dynQuantita.Text = quant.ToString();
            }
        }

        private bool DoChecks(string ope)
        {
            bool retValue = true;
            double quant = 0;
            double num = 0;

            LottoFacade lot = new LottoFacade();

            if (double.TryParse(dynnumScatoleTextBox.Text, out num))
            {

                //.......ERRORE: Giacenza totale insufficiente--inizio
                quant = (num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura);
                if (ope == "A")
                {
                    //quant = (num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura);
                    double m_giac = lot.GetGiacenza(((Polvere)dynCmbPolveri.SelectedValue).ID);
                    if (Math.Round(m_giac, 2) < Math.Round((quant), 2))
                    {
                        m_giacenzaInsufficienteflag = true;

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza totale insufficiente. Continuare?",
                                           "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                    }
                }
                if (ope == "M")
                {
                    quant = (num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura);
                    double m_giac = lot.GetGiacenza(((Polvere)dynCmbPolveri.SelectedValue).ID);

                    //quant = num * ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura;
                    double m_giacOld = m_giac + quant_old;
                    if (Math.Round(m_giacOld, 2) < Math.Round(quant, 2))
                    {
                        m_giacenzaInsufficienteflag = true;

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza totale insufficiente. Continuare?",
                                           "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                    }
                }
                //.......ERRORE: Giacenza totale insufficiente--fine

                //.......ERRORE: Giacenza lotto insufficiente--inizio
                if (ope == "A")
                {
                    if (Math.Round((((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza), 2) < Math.Round(quant, 2))
                    {

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza lotto insufficiente. Continuare?",
                            "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                        else
                        {
                            m_giacenzaInsufficienteflag = true;
                            //dynQuantita.Text = (((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza).ToString();
                            //dynnumScatoleTextBox.Text = ((((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza) / ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura).ToString();
                        }

                    }
                }
                //if (ope == "M" && (quant > quant_old))
                if (ope == "M")
                {
                    double m_giacOld = (((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza) + quant_old;
                    if (Math.Round(quant, 2) > Math.Round(m_giacOld, 2))
                    {

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza lotto insufficiente. Continuare?",
                            "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                        else
                        {
                            m_giacenzaInsufficienteflag = true;
                            //dynQuantita.Text = (((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza).ToString();
                            //dynnumScatoleTextBox.Text = ((((Lotto)this.dynListvLotti.CheckedItems[0].Tag).Giacenza) / ((Scatola)(dyncmbScatole.SelectedValue)).Pezzatura).ToString();
                        }
                    }
                }
                //.......ERRORE: Giacenza lotto insufficiente--fine

                //.......ERRORE: Sottoscorta--inizio
                Polvere m_polvere = (Polvere)this.dynCmbPolveri.SelectedValue;
                if (ope == "A")
                {
                    if (Math.Round(m_polvere.ScortaMinima, 2) > Math.Round((lot.GetGiacenza(m_polvere.ID) - quant), 2))
                    {
                        m_sottoScortaFlag = true;

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza totale inferiore alla Scorta minima. Continuare?",
                                                                 "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                    }
                }
                if (ope == "M")
                {
                    if (Math.Round(m_polvere.ScortaMinima, 2) > Math.Round((lot.GetGiacenza(m_polvere.ID) + quant_old - quant),2))
                    {
                        m_sottoScortaFlag = true;

                        if (System.Windows.Forms.MessageBox.Show("Attenzione!...Giacenza totale inferiore alla Scorta minima. Continuare?",
                                                                 "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                        {
                            retValue = false;
                            return retValue;
                        }
                    }
                }
            }
            //.......ERRORE: Sottoscorta--fine


            Lotto m_lottoSelezionato = (Lotto)this.dynListvLotti.CheckedItems[0].Tag;  // lotto selezionato...
            Lotto m_lottoAnziano = (Lotto)this.dynListvLotti.Items[0].Tag;  // lotto selezionato piu' vecchio...
            //m_lottoAnziano = null;

            //foreach (ListViewItem item in this.dynListvLotti.Items)
            //{
            //    if (((Lotto)item.Tag).Giacenza > 0)
            //    {
            //        m_lottoAnziano = (Lotto)item.Tag;
            //        break;
            //    }
            //}


            //if (!lot.CheckLottoPiuVecchio(m_polvere.ID, m_lotto.DataDdt))            
            if (DateTime.Compare(m_lottoAnziano.DataDdt, m_lottoSelezionato.DataDdt) != 0)
            {
                if (System.Windows.Forms.MessageBox.Show("Attenzione!...Non è stato selezionato il lotto più vecchio. Continuare?",
                                                         "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    retValue = false;
                    return retValue;
                }
            }

            if (DateTime.Compare(m_lottoSelezionato.DataScadenzaLotto, DateTime.Now) < 0)
            {
                if (System.Windows.Forms.MessageBox.Show("Attenzione!...E' stato selezionato un lotto scaduto. Continuare?",
                                                         "Conferma Aggiornamento", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    retValue = false;
                    return retValue;
                }
            }

            return retValue;
        }

        private bool ApplyRules()
        {
            int num = 0;
            CoreWebLibrary.Validation.Windows.BrokenWebRules brokenRules = new CoreWebLibrary.Validation.Windows.BrokenWebRules(SetStyles());

            brokenRules.Required(this.dynnumScatoleTextBox.Text, "Numero Scatole", "Numero Scatole obbligatorio", this.lblNumDDT, dynnumScatoleTextBox);
            brokenRules.Assert(this.dynnumScatoleTextBox.Text != string.Empty &&
                               int.TryParse(dynnumScatoleTextBox.Text, out num) &&
                               num != 0, "Impianto", "Attenzione!... e' necessario selezionare un impianto",
                               this.lblNumDDT, this.dyncmbImpianti);

            brokenRules.Assert(this.dynListvLotti.CheckedItems.Count != 0, "Other Movie", "You must include your favorite movie if Other was selected",
                               this.lblNumDDT, this.dynListvLotti);

            brokenRules.Assert(this.dyncmbImpianti.SelectedValue != null, "Impianto", "Attenzione!... e' necessario selezionare un impianto",
                               this.lblNumDDT, this.dyncmbImpianti);

            //brokenRules.Required(tbLastName.Text, "Last Name", "Last Name is required", lblLastName, tbLastName);
            //brokenRules.Required(ddlFavoriteMovie.SelectedItem.Text, "Favorite Movie", "Favorite Movie is required", lblFavoriteMovie, ddlFavoriteMovie);
            //brokenRules.Assert(ddlFavoriteMovie.SelectedValue != "Other" || tbFavoriteMovie.Text.Length > 0, "Other Movie", "You must include your favorite movie if Other was selected",
            //   lblFavoriteMovieOther, tbFavoriteMovie);

            return brokenRules.IsValid;
        }

        private CoreWebLibrary.Validation.Windows.BrokenRulesStyleCollection SetStyles()
        {
            //Set up the styles.  Likely this would be done in a BasePage or some other
            //central location.
            CoreWebLibrary.Validation.Windows.BrokenRulesStyleCollection brokenRulesStyles = new CoreWebLibrary.Validation.Windows.BrokenRulesStyleCollection();

            ////These styles will only apply to controls of Type System.Web.UI.WebControls.Label
            //brokenRulesStyles.AddInlineStyle("color", "red", lblFirstName.GetType());
            //brokenRulesStyles.AddInlineStyle("font-weight", "bold", lblFirstName.GetType());

            ////These styles will only apply to controls of Type System.Web.UI.WebControls.TextBox or 
            ////System.Web.UI.WebControls.DropDownList
            //brokenRulesStyles.AddInlineStyle("border", "solid 1px red", tbFirstName.GetType(), ddlFavoriteMovie.GetType());
            //brokenRulesStyles.AddInlineStyle("background-color", "#eeeeee", tbFirstName.GetType(), ddlFavoriteMovie.GetType());

            return brokenRulesStyles;
        }
        #endregion
    }
}
